import java.lang.reflect.Field;

public class TestDemo3 {
//     理解字符串不可变
    public static void main1(String[] args) {
        String str = "hello" ;
        str = str + " world" ;//str指向 hello world这个心对象
        str += "!!!" ;//地址都在变
//        这里至少有五个对象
//        hello
//         world
//        hello world
//        !!!
//        hello world!!!
        System.out.println(str);
    }

    public static void main2(String[] args) {
//        通过for循环来拼接 会产生许多的对象
//        在底层所有的拼接都会被优化为StringBuilt对象
//        这里字符串的拼接 会被优化为StringBuilt（进行append 和 toString操作）对象
        String str = "abcde";
        for (int i = 0; i < 10; i++) {
            str += i;
        }
        System.out.println(str);
    }


//    理解反射 但是反射一般不这么用
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String str = "Hello";
//        获取 String 类中的 value 字段. 这个 value 和 String 源码中的 value 是匹配的.
        Field valueField = String.class.getDeclaredField("value");
//        将这个字段的访问属性设为 true
        valueField.setAccessible(true);
//        把 str 中的 value 属性获取到.
        char[] value = (char[]) valueField.get(str);
//        修改 value 的值
        value[0] = 'h';
        System.out.println(str);

    }
}
